<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>集合</title>
</head>
<body>
<script>
    function Set(){
        this.data=[];
    }
    Set.prototype={
        add: function (data) {
            if(this.data.indexOf(data)<0){
                this.data.push(data);
                return true;
            }
            return false;
        },
        remove: function (data) {
            var idx=this.data.indexOf(data);
            if(idx>-1){
                this.data.splice(idx,1);
                return true;
            }
            return false;
        },
        size: function () {
            return this.data.length;
        },
        contains: function (data) {
            if(this.data.indexOf(data)>-1){
                return true;
            };
            return false;
        },
        //并集
        union: function (set) {
            var temp=new Set();
            for(var i=0;i<this.data.length;i++){
                temp.add(this.data[i]);
            }
            for(i=0;i<set.data.length;i++){
                if(!temp.contains(set.data[i])){
                    temp.add(set.data[i]);
                }
            }
            return temp;
        },
        //交集
        intersect: function (set) {
            var temp=new Set();
            for(var i=0;i<this.data.length;i++){
                for(var j=0;j<set.data.length;j++){
                    if(this.data[i]==set.data[j]){
                        temp.add(this.data[i]);
                        break;
                    }
                }
            }
            return temp;
        },
        //子集
        subset: function (set) {
            if(this.size()>set.size())return false;
            for(var i=0;i<this.data.length;i++){
                if(!set.contains(this.data[i]))return false;
            }
            return true;
        },
        //补集
        different: function (set) {
            var temp=new Set();
            for(var i=0;i<this.data.length;i++){
                if(!set.contains(this.data[i])){
                    temp.add(this.data[i]);
                }
            }
            return temp;
        },
        show: function () {
            console.info('show:',this.data);
        }
    }

    var names=new Set();
    names.add('David');
    names.add('Jennifer');
    names.add('Cynthia');
    names.add('Mike');
    names.add('Raymond');
    names.show();

    var a=new Set();
    a.add('A');
    a.add('B');
    a.add('C');
    a.add('D');
    a.add('E');

    var b=new Set();
    b.add('A');
    b.add('B');
    b.add('F');
    b.add('G');

    var c=new Set();
    c.add('A');
    c.add('B');
    c.add('C');
    c.add('D');
    c.add('E');
    c.add('F');
    c.add('G');

    console.log('union:',a.union(b));

    console.log('intersect:',a.intersect(b));

    console.log('subset:', a.subset(b));
    console.log('subset:', a.subset(c));
    console.log('subset:', b.subset(c));

    console.log('different:',a.different(b));
    console.log('different:',b.different(a));
    console.log('different:',b.different(c));
    console.log('different:',c.different(b));


</script>
</body>
</html>